/******************************************************************************* * Copyright (c) 2008 IBM Corporation and others. * All rights reserved. This program and the accompanying materials * are made available under the terms of the Eclipse Public License v1.0 * which accompanies this distribution, and is available at * http://www.eclipse.org/legal/epl-v10.html * * Contributors: * IBM Corporation - initial API and implementation ******************************************************************************/ package org.eclipse.ui.internal.menus; import org.eclipse.core.runtime.IConfigurationElement; import org.eclipse.core.runtime.SafeRunner; import org.eclipse.jface.util.SafeRunnable; import org.eclipse.ui.internal.WorkbenchPlugin; import org.eclipse.ui.internal.registry.IWorkbenchRegistryConstants; import org.eclipse.ui.menus.AbstractContributionFactory; import org.eclipse.ui.menus.ExtensionContributionFactory; import org.eclipse.ui.menus.IContributionRoot; import org.eclipse.ui.services.IServiceLocator; /** * Proxy cache entry that manages access to contributed instances of * {@link ExtensionContributionFactory}. * * @since 3.5 * */ public class ProxyMenuAdditionCacheEntry extends AbstractMenuAdditionCacheEntry { private AbstractContributionFactory factory; private boolean createFactory = true; /** * Create a new instance of this class. * * @param location the location URI * @param namespace the namespace * @param element the defining element */ public ProxyMenuAdditionCacheEntry(String location, String namespace, IConfigurationElement element) { super(location, namespace, element); } /* * (non-Javadoc) * * @see * org.eclipse.ui.menus.AbstractContributionFactory#createContributionItems * (org.eclipse.ui.services.IServiceLocator, * org.eclipse.ui.menus.IContributionRoot) */ public void createContributionItems(IServiceLocator serviceLocator, IContributionRoot additions) { AbstractContributionFactory factory = getFactory(); if (factory != null) factory.createContributionItems(serviceLocator, additions); } /** * Return the factory or <code>null</code> if it could not be obtained. * * @return the factory */ private AbstractContributionFactory getFactory() { if (createFactory) factory = createFactory(); return factory; } /** * Return the factory or <code>null</code> if it could not be obtained. * * @return the factory */ private AbstractContributionFactory createFactory() { final AbstractContributionFactory[] factory = new AbstractContributionFactory[1]; SafeRunner.run(new SafeRunnable() { public void run() throws Exception { factory[0] = (AbstractContributionFactory) WorkbenchPlugin .createExtension(getConfigElement(), IWorkbenchRegistryConstants.ATT_CLASS); } }); createFactory = false; return factory[0]; } }